package inputstream_;

import outputstream_.Dog;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/*
注意事项和细节说明
1)读写顺序要一致
2)序列化或反序列化的对象,需要实现 Serializable
3)序列化的类中建议添加 SerialVersionUID ,为了提高版本的兼容性
4)序列化对象时，默认将里面所有属性都进行序列化，但除了 static 或 transient(短暂的) 修饰的成员
5)序列化对象时，要求里面属性的类型也需要实现序列化接口
6)序列化具备可继承性,也就是如果某类已经实现了序列化，则它的所有子类也已经默认实现了序列化
 */

/**
 * @author DCSGO
 * @version 1.0
 * ObjectInputStream
 * 读取数据
 */
public class ObjectInputStream_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String filePath = "C:\\Users\\Administrator\\Desktop\\Javacode\\java-learning-code\\chapter19\\src\\outputstream_\\data.dat";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        //读取通过序列化保存的数据时 读取数据的顺序必须同 序列化数据的循序一致
        //以保证 在反序列化时 数据与其对应的操作相匹配
        System.out.println(ois.readInt());
        System.out.println(ois.readChar());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readUTF());

        Object o = ois.readObject();
        System.out.println(o);
        /* 没有给 Dog 重写 toString
         * 141
         * D
         * false
         * 假如没有联想？
         * outputstream_.Dog@70177ecd
         */

        //Dog 重写 toString 后再次运行
        //InvalidClassException: outputstream_.Dog; local class incompatible ... 抛出一堆恐怖的异常
        //此时需要我们重新运行保存对象的方法 即重新保存对象

        /* Dog 重写 toString 并重新保存对象后
         * 141
         * D
         * false
         * 假如没有联想？
         * Dog{name='旺财', age=3}
         */

        //要是我们要调用这个读出的对象的相关方法就必须向下转型
        //所以我们需要导入这个类所在的包
        //(在进行序列化时已将对象 及其相关信息 如所在包路径 一同保存故
        // 将对象的定义代码直接复制到当前类是不管用的 除非 有继承关系 否则会抛 ClassCastException 异常
        // outputstream_.Dog cannot be cast to inputstream_.Dog)
        //在此过程中只要 Dog 有更新我们都必须重新保存数据 否则又是抛异常
        Dog dog = (Dog) o;
        System.out.println(dog.getName());
        /* 导包 重新保存后运行
         * 141
         * D
         * false
         * 假如没有联想？
         * Dog{name='旺财', age=3}
         * 旺财
         */

        ois.close();
    }
}

